import dayjs from "dayjs";
//  zip.js 打包自动生成zip包，需npm i jszip -D
const createZip = function (env, output) {
	const { VITE_APP_ZIP_NAME } = env;
	const ZIP_DATE = dayjs(new Date()).format("YYYYMMDD-HHmm");
	const fileName = `manage${
		VITE_APP_ZIP_NAME ? `-${VITE_APP_ZIP_NAME}` : ""
	}-${ZIP_DATE}.zip`;
	const path = require("path");
	if (!output) output = path.resolve(__dirname, "../../dist"); //./distTest是根据实际路径而来
	const makeZip = function () {
		const path = require("path");
		const fs = require("fs");
		const JSZip = require("jszip");
		const zip = new JSZip();
		const distPath = path.resolve(output);
		const readDir = function (zip, dirPath) {
			// 读取dist下的根文件目录
			const files = fs.readdirSync(dirPath);
			files.forEach((fileName) => {
				const fillPath = path.join(dirPath, "./", fileName);
				const file = fs.statSync(fillPath);
				// 如果是文件夹的话需要递归遍历下面的子文件
				if (file.isDirectory()) {
					const dirZip = zip.folder(fileName);
					readDir(dirZip, fillPath);
				} else {
					// 读取每个文件为buffer存到zip中
					zip.file(fileName, fs.readFileSync(fillPath));
				}
			});
		};
		const removeExistedZip = () => {
			const dest = path.join(distPath, "./" + fileName);
			if (fs.existsSync(dest)) {
				fs.unlinkSync(dest);
			}
		};
		const zipDir = function () {
			readDir(zip, distPath);
			zip.generateAsync({
				type: "nodebuffer", // 压缩类型
				compression: "DEFLATE", // 压缩算法
				compressionOptions: {
					// 压缩级别
					level: 9,
				},
			}).then((content) => {
				const dist_zip = path.join(distPath, "../dist_zip");
				if (!fs.existsSync(dist_zip)) {
					fs.mkdir(dist_zip, (err) => {
						if (err) throw err;
						console.log("创建成功");
					});
				}
				const dest = path.join(distPath, "../dist_zip/" + fileName);
				// 把zip包写到硬盘中，这个content现在是一段buffer
				fs.writeFileSync(dest, content);
			});
		};
		zipDir();
	};
	return {
		name: "vite-plugin-auto-zip",
		apply: "build",
		closeBundle() {
			makeZip();
		},
	};
};
module.exports = createZip;
